package com.itheima.d1_create_thread;

/**
 * 目标：掌握线程的创建方式一:继承Thread类
 *
 * 什么是线程？
 *  线程(Thread)是一个程序内部的一条执行流程。
 *  程序中如果只有一条执行流程，那这个程序就是单线程的程序。
 * 多线程是什么？
 *  多线程是指从软硬件上实现的多条执行流程的技术（多条线程由CPU负责调度执行）。
 * 如何在程序中创建出多条线程？
 *    Java是通过java.lang.Thread 类的对象来代表线程的。
 *
 * 多线程的创建方式一：继承Thread类
 *      定义一个子类MyThread继承线程类java.lang.Thread，重写run()方法
 *      创建MyThread类的对象
 *      调用线程对象的start()方法启动线程（启动后还是执行run方法的）
 *方式一优缺点：
 * 优点：编码简单
 * 缺点：线程类已经继承Thread，无法继承其他类，不利于功能的扩展。
 *
 * 注意事项：
 *  1、启动线程必须是调用start方法，不是调用run方法。
 *      直接调用run方法（会把这个线程对象当做一个普通的Java对象来调用这个方法）会当成普通方法执行，此时相当于还是单线程执行。
 *      只有调用start方法才是启动一个新的线程执行。
 *  2、不要把主线程任务放在启动子线程之前。
 *      这样主线程一直是先跑完的，相当于是一个单线程的效果了。
 *
 * 1、什么是多线程？线程的代表是谁？线程创建方式一的具体步骤是？
 * 继承Thread类
 * 重写run方法
 * 创建线程对象
 * 调用start()方法启动。
 * 2、线程的第一种创建方式有啥优缺点？
 * 优点：编码简单
 * 缺点：存在单继承的局限性，线程类继承Thread后，不能继承其他类，不便于扩展。
 *
 *  Thread提供的常见构造器
 * public Thread(String name)                   可以为当前线程指定名称
 * public Thread(Runnable target)               封装Runnable对象成为线程对象
 * public Thread(Runnable target, String name)  封装Runnable对象成为线程对象，并指定线程名称
 */
public class ThreadTest1 {
    // main方法是由一条默认的主线程负责执行。
    public static void main(String[] args) {

        // 3、创建MyThread线程类（Thread的子类）的对象代表一个线程
        Thread t = new MyThread();      //多态写法

        /*
        源码：
        有参构造器
        public Thread(String name) {
        this(null, null, name, 0);
    }
    无参构造器
        public Thread() {
        this(null, null, "Thread-" + nextThreadNum(), 0);
    }
         */
        //Thread z1 = new Thread();

        // 4、启动线程（自动执行run方法的）
        /*
         *  3、直接调用run方法会当成普通方法执行(会把这个线程对象当做一个普通的Java对象来调用这个方法)，此时相当于还是单线程执行。
         *  4、只有调用start方法才是启动一个新的线程执行。（相当于向我们的CPU去注册这个对象作为一个单独执行的流程，也就是线程）
         */
        //t.run();
        t.start();
        //所以运行起来后，就实现了多线程，因为现在实际上是有两个线程：main线程 t线程

        //弹幕：本质上CPU一次只能执行一个线程，CPU存在一个叫时间片的东西，这个东西会限制每个线程的执行时间，让线程轮流执行，CPU处理速度又很快所以看起来就像同时在执行
        for (int i = 1; i <= 5; i++) {
            System.out.println("主线程main输出：" + i);
        }
    }
}
